#include <opencv/cv.h>
#include <opencv/highgui.h>

#include <math.h>
#include <iostream>
#include <fstream>

using namespace std;

#include "stringSplit.h"

#ifndef CLUT2_H
#define CLUT2_H

////////////////////////////////////////////////////////////////////////////////////////////
//CLUT management
////////////////////////////////////////////////////////////////////////////////////////////
bool loadCLUT(string filename, cv::SparseMat & clut);
bool saveCLUT(string filename, cv::SparseMat & clut);

////////////////////////////////////////////////////////////////////////////////////////////
//FuzzyCLUT management
////////////////////////////////////////////////////////////////////////////////////////////
bool loadFuzzyCLUT(string filename, cv::SparseMat & fuzzyclut);
bool saveFuzzyCLUT(string filename, cv::SparseMat & fuzzyclut);

bool createFromDataFuzzyCLUT(string filename, int res, int depth, cv::SparseMat & fuzzyclut);
void normalizeFuzzyCLUT(cv::SparseMat & fuzzyclut);
void gaussianKernelFuzzyCLUT(cv::SparseMat & fuzzyclut,float kernel_sigma, int kernel_size);

////////////////////////////////////////////////////////////////////////////////////////////
//Convert FuzzyCLUT --> CLUT
////////////////////////////////////////////////////////////////////////////////////////////
void maxFuzzyCLUT_2_CLUT(cv::SparseMat & fuzzyclut, cv::SparseMat & clut);
void entropyFuzzyCLUT_2_CLUT(cv::SparseMat & fuzzyclut, cv::SparseMat & clut);

////////////////////////////////////////////////////////////////////////////////////////////
//Access Fonctions
////////////////////////////////////////////////////////////////////////////////////////////
uchar CLUT(cv::SparseMat & clut,uchar r,uchar g,uchar b);
void CLUT(cv::SparseMat & clut,uchar r,uchar g,uchar b,uchar classe);

float FuzzyCLUT(cv::SparseMat & fuzzyclut,uchar r,uchar g,uchar b,uchar classe);
void FuzzyCLUT(cv::SparseMat & clut,uchar r,uchar g,uchar b,uchar classe, float prob);
void FuzzyCLUT(cv::SparseMat & clut,int index,uchar classe, float prob);

////////////////////////////////////////////////////////////////////////////////////////////
//Apply on Images
////////////////////////////////////////////////////////////////////////////////////////////
void RGB_2_Cn(cv::Mat & src, cv::SparseMat & clut, cv::Mat & des);
void Cn_2_RGBn(cv::Mat & src, cv::Mat & des);
void RGB_2_RGBn(cv::Mat & src, cv::SparseMat & clut, cv::Mat & des);

#endif